/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:张熳
 * Date:2025-08-13
 * Time:0:27
 */

/**
 * 汉诺塔：
 * 有三根柱子 A B C，我们的目的是要将所有的盘子（小的盘子放在最上面）全部移动到C柱子上 【A表示起始柱子，B表示中转柱子，C表示目标柱子】
 * 如果只有 1个盘子：A->C（直接将这个盘子移到目标柱子C）
 * 2个盘子:A->B,A->C,B->C(先将小盘子从A移动到B，然后将大盘子从A移到C，最后将小盘子从B移到C，这样所有盘子就按指定的顺序在C柱子上)
 * 3个盘子：A->C,A->B,C->B,A->C,B->A,B->C,A->C(先将小盘子从A移到C，将中盘子从A移到B，然后将小盘子从C移到B，此时小中盘就都在B柱子上
 * 然后将再将大盘子从A移到C，接着再将小盘子从B移到A，将中盘子从B移到C，最后将小盘子从A移到C，这样就将3个盘子按指定的顺序放到了目标柱子C)
 *
 * 我们要用递归来解决这个问题：首先创建变量 start表示起始柱子 helper表示中转柱子  end表示目标柱子  n表示盘子数量
 * 通过上述的分析，我们知道除了最下层的大盘子外，其余的盘子都是经过中转柱子B再移到目标柱子C的，
 * 即我们需要将n-1个盘子先移到B上后，将大盘子移到C上，重复这个操作，每次将除了大盘子（会变化）外的n-1个盘子先移到B上后，将大盘子移到C上
 * 直到所有的盘子都按指定的顺序（最小的盘子在最上面）在目标盘子上，才完成了这个问题
 */
public class Test {
    public static void main(String[] args) {
        //递归求汉诺塔问题
        int n = 3;//3个盘子
        hanoi(n,'A','C','B');
    }
    public static void hanoi(int n,char start,char end,char helper){
        //只有1个盘子
        if (n == 1){
            System.out.println("移动盘子1从" + start + "->" + end);
            return;
        }
        //1.将上面n-1个盘子移到中转柱B
        hanoi(n-1,start,helper,end);
        //2.移动最底层的盘子到目标柱子C
        System.out.println("移动盘子" + n + "从" + start + "->" + end);
        //3.将n-1个盘子从中转柱B移到目标柱C
        hanoi(n-1,helper,end,start);
    }
    public static void move(char pos1,char pos2){
        System.out.println();
    }
    public static void main3(String[] args) {
        //重载：定义方法求2个整数的最大值，或3个小数的最大值
        int x = 10;
        int y = 20;
        System.out.println(max(x,y));

        double a = 12.5;
        double b = 10.0;
        double c = 15.0;
        System.out.println(max(a,b,c));
    }
    public static int max(int a,int b){
        return a > b ? a : b;
    }
    public static double max(double a,double b,double c){
        double maX = a > b ? a : b;
        return maX > c ? maX : c;
    }
    public static void main2(String[] args) {
        //重载：在同一个类中，分别定义两个整数的方法和三个小数之和的方法
        int x = 20;
        int y = 25;
        System.out.println(add(x,y));

        float a = 10.0f;
        float b = 12.5f;
        float c = 2.0f;
        System.out.println(add(a,b,c));
    }
    public static int add(int a,int b){
        return a+b;
    }
    public static float add(float a, float b,float c){
        return a+b+c;
    }
    public static void main1(String[] args) {
        //创建方法求两个数的最大值max2，再写一个求3个数的最大值的方法max3,在max3方法中调用max2实现
        int x = 20;
        int y = 30;
        int ret = max2(x,y);
        System.out.print("两个数中最大数为:");
        System.out.println(ret);

        int a = 50;
        int b = 30;
        int c = 40;
        int ret2 = max3(a,b,c);
        System.out.print("三个数中最大的数为:");
        System.out.println(ret2);
    }
    public static int max3(int a,int b,int c){
        int max = max2(a,b);
        int ret = max2(max,c);
        return ret;
    }
    public static int max2(int a,int b){
        return a > b ? a : b;
    }
}
